package com.fbt.transfer.app.driver.http;

import com.fbt.transfer.app.driver.model.*;
import com.fbt.transfer.app.driver.model.grab.WaitOrderUnit;
import com.fbt.transfer.app.driver.model.index.IndexStats;
import com.fbt.transfer.app.driver.model.index.OrderDetail;
import com.fbt.transfer.app.driver.model.index.OrderUnitVo;
import com.fbt.transfer.app.driver.model.me.*;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

/**
 * 从后台获取数据的接口
 */
public interface ApiInterface {

  /**
   * 登陆
   *
   * @param username 用户名
   * @param password 密码
   * @return 登陆的响应结果
   */
  @FormUrlEncoded
  @POST("toLogin")
  Call<Result<AccessToken>> login(
      @Field("login_name") String username,
      @Field("login_pwd") String password
  );

  @GET("profile")
  Call<Result<ProfileInfo>> personInfo();

  /**
   * 退出登陆
   *
   * @return 退出登陆的响应结果
   */
  @GET("signOut")
  Call<Result<Boolean>> logout();
  /**
   * 获取OSS配置信息
   *
   * @param behavior 当前默认为lost
   * @return 获取OSS认证信息
   */
  @GET("file/auth")
  Call<Result<OSSAuth>> getOSSAuth(@Query("behavior") String behavior);
  /**
   * 检查登陆状态
   *
   * @return true-已登陆，false-未登陆
   */
  @GET("checkLogin")
  Call<Result<Boolean>> checkLogin();

  /**
   * 首页统计信息
   * @return 统计信息
   */
  @GET("index/v1/stats")
  Call<Result<IndexStats>> indexStats();
  
  /**
   * 首页我的订单
   *
   * @param pageNum 页码
   * @param pageSize 页面大小
   * @param today true,查询今天的订单，false，查询明天的订单
   * @return 订单列表
   */
  @GET("index/list")
  Call<Result<PageInfo<OrderUnitVo>>> indexOrderList(
      @Query("pageNum") int pageNum,
      @Query("pageSize") int pageSize,
      @Query("today") boolean today);
  
  /**
   * 查看订单详情
   *
   * @param orderId 订单ID
   */
  @GET("order/{orderId}/info")
  Call<Result<OrderDetail>> orderDetails(@Path("orderId") String orderId);

  /**
   * 是否显示订单dialog
   *
   * @param orderId 订单ID
   * @return 检查是否有抢单的资格
   */
  @GET("order/v1/{orderId}/check")
  Call<Result<Boolean>> checkOrder(@Path("orderId") String orderId);
  
  /**
   * 抢单
   *
   * @param orderId 订单ID
   * @return 是否抢单成功
   */
  @GET("order/v1/{orderId}/locking")
  Call<Result<Boolean>> scrambleFroOrder(@Path("orderId") String orderId);

  /**
   * 改变订单状态
   *
   * @param orderId 订单ID
   * @return 是否成功
   */
  @GET("order/{orderId}/change")
  Call<Result<Boolean>> changeOrderStatus(@Path("orderId") String orderId);
  
  /**
   * 抢单大厅订单列表
   * @param appQuery-pageSize-页面
   * @return
   */
  @POST("order/v2/grab/list")
  Call<Result<PageInfo<WaitOrderUnit>>> grabList(@Body GrabPageQuery grabPageQuery);

  /**
   * 获取历史订单列表
   *
   * @param pageNum 当前第几页
   * @param pageSize 一页多少条数据
   * @param isQueryHistory true-查询历史订单,固定值
   * @return
   */
  @GET("order/history/list")
  Call<Result<PageInfo<HistoryOrderUnit>>> orderHistories(
      @Query("pageNum") int pageNum,
      @Query("pageSize") int pageSize,
      @Query("isQueryHistory") boolean isQueryHistory);

  /**
   * 上传司机经纬度
   *
   * @return 上传成功与否
   */
  @POST("location/upload")
  Call<Result<Boolean>> upLocation(@Body Map<String, Object> map);
  /**
   * 接受或者拒绝转单请求
   *
   * @param orderId 订单ID
   * @param suggestion true-接受转单，false-拒绝
   * @return 结果
   */
  @GET("assign/order/change/t/suggestion")
  Call<Result<Boolean>> handlerTransfer(
      @Query("orderId") String orderId, @Query("suggestion") boolean suggestion);
  /**
   * 检查APP版本更新
   *
   * @param appQuery 参数
   * @return 最后的版本信息
   */
  @GET("app/config")
  Call<Result<AppUpdateConfig>> checkUpdate(@QueryMap Map<String, Object> appQuery);
  /**
   * 查询账户余额
   * @return 账户余额
   */
  @GET("account/transfer/query/balance")
  Call<Result<BalanceInfoVo>> queryBalance();

  /**
   * 根据类型业务发送对应的验证码，
   *
   * @param smsType 1-提现，2-代领申请，3-设置支付密码，4-转账
   * @return 短信结果
   */
  @GET("account/withdrawal/sms/send")
  Call<Result<SendSmsResult>> smsSendByType(@Query("smsType") Integer smsType);

  /**
   * 获取提现功能状态
   *
   * @return 提现功能状态
   */
  @GET("account/info")
  Call<Result<WithdrawalFunctionRest>> functionWithdrawal();

  /**
   * 查询最后一条流水纪录的日期
   *
   * @return yyyy-MM-dd
   */
  @GET("balance/v3/lastDate")
  Call<Result<String>> lastFlowDate();

  /**
   * 分页查询账户流水
   * @param pageNum 第几页
   * @param pageSize 每一页多少条数据
   * @param queryMonth 查询的月份，格式：yyyy-MM
   * @return
   */
  @GET("balance/v3/list")
  Call<Result<AccountDetailVo>> accountDetailList(
      @Query("pageNum") int pageNum,
      @Query("pageSize") int pageSize,
      @Query("queryMonth") String queryMonth);

  /**
   * 设置支付密码
   *
   * @param params smsCode-短信验证码，payPwd-设置的转账密码
   * @return s
   */
  @POST("account/transfer/set/payPwd")
  Call<Result<Boolean>> setPaymentPwd(@Body Map<String, String> params);

  /*
   * 申请解约-关闭提现功能
   */
  @GET("account/withdrawal/sign/v1/user/release")
  Call<Result<ContractingUnSignResult>> signRelease();

  /**
   * 查询平台支持的提现方式
   * @return 提现方式
   */
  @GET("account/withdrawal/methods")
  Call<Result<List<WithdrawalMethod>>> queryWithdrawalTypes();

  /**
   * 提现条件
   * @return 提现条件信息
   */
  @GET("account/withdrawal/check/preview")
  Call<Result<WithdrawalValid>> checkOpen();

  /**
   * 获取签约成功的账户信息
   * @return 账户信息
   */
  @GET("account/withdrawal/sign_info")
  Call<Result<SignAccountInfo>> getPayoutSignData();

  /**
   * 获取之前的申请信息
   * @return 申请信息
   */
  @GET("account/withdrawal/authorization/last")
  Call<Result<PayoutAuthorization>> getPayoutAuthorization();

  /**
   * 提交开通提现功能所需要的资料
   * @param payoutAuthorization 提交的数据
   * @return 结果，true-提交成功，false--提交失败
   */
  @POST("account/withdrawal/authorization/apply")
  Call<Result<Boolean>> commitPayoutAuthorization(@Body PayoutAuthorization payoutAuthorization);

  /**
   * 确认转账前进行查询，如果是第一次转账则需要收款人的短信确认，如果非第一次则直接通过
   * @param phone 收款人手机号
   * @param realName 收款人姓名
   * @return 检查信息
   */
  @GET(value = "account/transfer/check/preview")
  TransferCheckInfo transferCheck(@Query("phone") String phone,@Query("phone") String realName);
  /**
   * 提交转账
   * @param transferReq  转账请求
   * @return true-成功，false-失败
   */
  @POST("account/transfer/confirm")
  Call<Result<TransferResult>> confirmTransfer(@Body TransferReq transferReq);

  /**
   * 获取最后一次转账的信息
   * @return 收款人信息
   */
  @GET("account/transfer/last/info")
  Call<Result<Map<String,String>>> lastTransfer();
}
